package com.zeus.config;

import com.zeus.pojo.User;
import com.zeus.service.UserService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * @author 冯扬龙
 * @date 2021/6/7 9:34
 * 首先自定义一个Realm类，然后重写两个方法AuthorizationInfo，AuthenticationInfo
 * 这两个方法分别对应用户的授权和认证
 */
public class UserRealm extends AuthorizingRealm {

    @Autowired
    private UserService userService;

//    认证
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
//       可以通过这里对用户进行授权
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();

//        对user:add进行授权，user：add出现在shiroConfig中，但是这种是写死了，需要在数据库里为每个用户定义对应的权限，根据实际需求来写
//        info.addStringPermission("user:add");

        Subject subject = SecurityUtils.getSubject();
//        拿到相应的登录对象
        User currentUser = (User)subject.getPrincipal();
//        设置当前用户的访问权限,现在的权限是从数据库里取，不是写死的
//        info.addStringPermission(currentUser.getPerim());
        return info;
    }

////    授权
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
//        /**
//         客户端传过来的是用户和密码，然后通过UsernamePasswordToken封装到token里面
//         再通过跟数据库匹配看看用户名是不是在数据库中，不包含的话就抛出错误，写完了这个还要
//         在配置类中对这个相应的功能进行配置
//         */
//        UsernamePasswordToken userToken = ( UsernamePasswordToken)token;
////        User user = userService.selectUserByName(userToken.getUsername());
//        if(user == null){
//            return null;//等于会抛出这个异常UnknowAccountException
//        }
//        Subject currentSubject  =  SecurityUtils.getSubject();
//        Session session = currentSubject.getSession();
//        session.setAttribute("loginUser",user);
//
//
////            shiro做密码认证,里面的逻辑我们不用管，shiro自动帮我们做好了
////            shiro里有md5盐值加密,对明文进行加密以后还可以再拼接上用户名
//            return new SimpleAuthenticationInfo(user,user.getPwd(),"");
        return null;
    }
}
